# -*- coding: utf-8 -*-
from wechatpy import WeChatClient
from wechatpy.session.redisstorage import RedisStorage
from redis import Redis
# from main.settings import REDIS_STORE_URL
# import base#上线需要取消
import os
from wechatpy.pay import WeChatPay
from main.settings import CERT_DIR
from wechatpy.pay.utils import get_external_ip, rsa_encrypt
from wechatpy.pay.base import BaseWeChatPayAPI

class WeChatClientApi(object):
    def __init__(self,app_id,secret,redis_url):
        self.app_id = app_id
        self.secret = secret
        self.redis_url = redis_url
        
    def wechat_client(self):
        client = WeChatClient(self.app_id, self.secret)
        redis_client = Redis.from_url(self.redis_url)
        session_interface = RedisStorage(
            redis_client,
            prefix="wechatpy"
        )
        wechat_client = WeChatClient(
            self.app_id,
            self.secret,
            session=session_interface
        )

        return wechat_client

    # user_id – 用户 ID 。 就是你收到的 Message 的 source
    # template_id – 模板 ID。在公众平台线上模板库中选用模板获得
    # url – 链接地址
    # data – 模板消息数据
    # mini_program – 跳小程序所需数据, 如：{‘appid’: ‘appid’, ‘pagepath’: ‘index?foo=bar’}
    def sendtmpmsg(self,wechat_client,user_id,template_id,data,url=None):
        wechat_client.message.send_template(user_id, template_id, data, url, mini_program=None)

class WeChatPayApi(object):

    # appid – 微信公众号 appid
    # sub_appid – 当前调起支付的小程序APPID
    # api_key – 商户 key,不要在这里使用小程序的密钥
    # mch_id – 商户号
    # sub_mch_id – 可选，子商户号，受理模式下必填
    # mch_cert – 必填，商户证书路径
    # mch_key – 必填，商户证书私钥路径
    # timeout – 可选，请求超时时间，单位秒，默认无超时设置
    # sandbox – 可选，是否使用测试环境，默认为 False
    def __init__(self,app_id,api_key,mch_id,mch_key,mch_cert):
        self.app_id = app_id
        self.api_key = api_key
        self.mch_id = mch_id
        self.mch_cert = mch_cert
        self.mch_key = mch_key

        self.wechatapiutil = WeChatPay(self.app_id,self.api_key,self.mch_id,None,self.mch_cert,self.mch_key,None,None,None)
    #转账
    # user_id – 接受收红包的用户在公众号下的 openid
    # amount – 付款金额，单位分,最少1元也就是100分
    # desc – 付款说明
    # client_ip – 可选，调用接口机器的 IP 地址
    # check_name – 可选，校验用户姓名选项， NO_CHECK：不校验真实姓名, FORCE_CHECK：强校验真实姓名（未实名认证的用户会校验失败，无法转账）, OPTION_CHECK：针对已实名认证的用户才校验真实姓名（未实名认证用户不校验，可以转账成功）, 默认为 OPTION_CHECK
    # real_name – 可选，收款用户真实姓名， 如果check_name设置为FORCE_CHECK或OPTION_CHECK，则必填用户真实姓名
    # out_trade_no – 可选，商户订单号，需保持唯一性，默认自动生成
    # device_info – 可选，微信支付分配的终端设备号
    def zhuanzhang(self,user_id, amount, desc, client_ip=None, check_name='OPTION_CHECK', real_name=None, out_trade_no=None, device_info=None):
        # wcp = WeChatPay(self.app_id,self.api_key,self.mch_id,None,self.mch_cert,self.mch_key,None,None,None)
        res = self.wechatapiutil.transfer.transfer(user_id, amount, desc, client_ip, check_name, real_name, out_trade_no, device_info)
        print(res)
        return res

    # user_id – 接收红包的用户在公众号下的 openid
    # total_amount – 红包金额，单位分
    # send_name – 商户名称
    # act_name – 活动名称
    # wishing – 红包祝福语
    # remark – 备注
    # client_ip – 可选，调用接口的机器 IP 地址
    # total_num – 可选，红包发放总人数，默认为 1
    # out_trade_no – 可选，商户订单号，默认会自动生成
    # scene_id – 可选，发放红包使用场景，红包金额大于200时必传
    # consume_mch_id – 可选，资金授权商户号。服务商替特约商户发放时使用
    def fahongbao(self,user_id, total_amount, send_name, act_name, wishing, remark, total_num=1, client_ip=None, out_trade_no=None, scene_id=None, consume_mch_id=None):
        res = self.wechatapiutil.redpack.send(user_id, total_amount, send_name, act_name, wishing, remark, total_num, client_ip, out_trade_no, scene_id, consume_mch_id)
        print(res)
        return res
if __name__ == "__main__":
    # BASE_DIR = Path(__file__).resolve().parent.parent
    # CERT_DIR=os.path.join(os.path.split(BASE_DIR)[0], 'cert/' ).replace('\\','/')
    

    # appid – 微信公众号 appid
    # sub_appid – 当前调起支付的小程序APPID
    # api_key – 商户 key,不要在这里使用小程序的密钥
    # mch_id – 商户号
    # sub_mch_id – 可选，子商户号，受理模式下必填
    # mch_cert – 必填，商户证书路径
    # mch_key – 必填，商户证书私钥路径
    # timeout – 可选，请求超时时间，单位秒，默认无超时设置
    # sandbox – 可选，是否使用测试环境，默认为 False
    # (appid, api_key, mch_id, sub_mch_id=None, mch_cert=None, mch_key=None, timeout=None, sandbox=False, sub_appid=None

    app_id = 'wxff92ea6443261eee'
    api_key = '1e62fba4dac15df3ffe12373a49a89dc'
    mch_id = '1503959351'
    mch_cert = CERT_DIR+'fuwuhao/apiclient_cert.pem'
    mch_key = CERT_DIR+'fuwuhao/apiclient_key.pem'

    wpa = WeChatPayApi(app_id,api_key,mch_id,mch_key,mch_cert)

    # wcp = WeChatPay(app_id,api_key,mch_id,None,mch_cert,mch_key,None,None,None)

    
    
    user_id = 'orN6Y0WQl5X9dnAUD19KVAV5Vy9s'
    amount = 101
    desc = '提现金额'
    client_ip = '127.0.0.1'
    check_name = 'NO_CHECK'
    real_name = None
    # out_trade_no = '123'
    device_info = '优汇谷'
    
    #企业转账
    # wpa.zhuanzhang(user_id, amount, desc, client_ip, check_name, real_name, None, device_info)

    #发红包
    user_id = 'orN6Y0YQtylKcPRGQjBnK2DycDjo'
    total_amount = 102
    send_name = '元旦快乐祝福'
    act_name = '元旦快乐',
    wishing = '双旦快乐'
    remark = '恭喜你，赢得本次福利'
    total_num = 1 
    client_ip = '114.85.122.189'
    out_trade_no = None
    scene_id = None
    consume_mch_id = None
    wpa.fahongbao(user_id, total_amount, send_name, act_name, wishing, remark, total_num, client_ip, out_trade_no, scene_id, consume_mch_id)
    print("测试提现支付",CERT_DIR)